package com.le.buddha.service.impl;

import com.le.buddha.common.cosyvoice.GuoleCosyVoiceDemo;
import com.le.buddha.service.IVoiceService;
import com.le.buddha.service.IFileService;
import com.le.buddha.service.IWeChatService;
import com.tencentcloudapi.asr.v20190614.AsrClient;
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionRequest;
import com.tencentcloudapi.asr.v20190614.models.SentenceRecognitionResponse;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.tts.v20190823.TtsClient;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceRequest;
import com.tencentcloudapi.tts.v20190823.models.TextToVoiceResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import com.google.gson.Gson;

import java.nio.ByteBuffer;
import java.util.Base64;
import java.util.UUID;

/**
 * 腾讯服务实现
 * @author guole
 * @created 2024/10/5
 */
@Slf4j
@ConditionalOnProperty(name = "voiceService",havingValue = "tencent")
@Service
public class TencentVoiceServiceImpl implements IVoiceService {
    @Resource
    private IWeChatService weChatService;

    //SpeechClient应用全局创建一个即可,生命周期可和整个应用保持一致
     @Override
    public byte[] textToSpeech(String text,String cosyVoiceName,Integer speech) {
         try{
             // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
             // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性
             // 以下代码示例仅供参考，建议采用更安全的方式来使用密钥
             // 请参见：https://cloud.tencent.com/document/product/1278/85305
             // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取

             Credential cred = new Credential("AKIDJVXQ6ZqdEb0FKG1c2JSabWM3aw9FAwXv", "HNL7i8NUQ9ew1xudEdonmhRF4mHYdVEl");

              // 使用临时密钥示例
             // Credential cred = new Credential("SecretId", "SecretKey", "Token");
             // 实例化一个http选项，可选的，没有特殊需求可以跳过
             HttpProfile httpProfile = new HttpProfile();
             httpProfile.setEndpoint("tts.tencentcloudapi.com");
             // 实例化一个client选项，可选的，没有特殊需求可以跳过
             ClientProfile clientProfile = new ClientProfile();
             clientProfile.setHttpProfile(httpProfile);
             // 实例化要请求产品的client对象,clientProfile是可选的
             TtsClient client = new TtsClient(cred, "", clientProfile);
             // 实例化一个请求对象,每个接口都会对应一个request对象
             TextToVoiceRequest req = new TextToVoiceRequest();
            req.setText(text);
            req.setSessionId(UUID.randomUUID().toString());
             req.setVoiceType(Long.valueOf(cosyVoiceName));
              // 返回的resp是一个TextToVoiceResponse的实例，与请求对象对应
             TextToVoiceResponse resp = client.TextToVoice(req);
             // 输出json格式的字符串回包
            String base64= resp.getAudio();
             byte[] byteArray = Base64.getDecoder().decode(base64);
             return  byteArray;
          } catch (Exception e) {
             e.printStackTrace();
         }
         return  null;
     }



    @Override
    public String cloneVoice(String voiceName, String fileUrl) {
        return "我是腾讯";
    }

    @Override
    public String speechToText(byte[] file) {
        String resultTxt="";
        try {
            byte[] bytes=file;
            String data=Base64.getEncoder().encodeToString(bytes);
            Credential cred = new Credential("AKIDJVXQ6ZqdEb0FKG1c2JSabWM3aw9FAwXv", "HNL7i8NUQ9ew1xudEdonmhRF4mHYdVEl");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("asr.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            AsrClient client = new AsrClient(cred, "", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SentenceRecognitionRequest req = new SentenceRecognitionRequest();
            req.setEngSerViceType("16k_zh");
            req.setSourceType(1L);
            req.setVoiceFormat("m4a");
            req.setData(data);
            req.setDataLen(Integer.toUnsignedLong(bytes.length));
            // 返回的resp是一个SentenceRecognitionResponse的实例，与请求对象对应
            SentenceRecognitionResponse resp = client.SentenceRecognition(req);
            // 输出json格式的字符串回包
            resultTxt =resp.getResult();

        } catch (
                TencentCloudSDKException e) {
            log.error("文本转语音错误{}",e.toString());
        }
        return resultTxt;
    }



}
